package com.zk.mockito.matcher;

import com.zk.service.BookService;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.when;

public class Any_2_Test_Spy {

    /**
     * any() 可以表示任意值或属性的传入
     * anyInt() 可以替代基础类型 int的数值验证。
     * any(Integer.class) 用于验证类型对象，注意：本方法排除null值
     */
    @Test
    public void testAnyInt() {
        BookService bookService = Mockito.spy(BookService.class);
        final int Target = 10;
        when(bookService.getShelfNumber(anyInt()))
                .thenReturn(Target);
        int shelfNumber = bookService.getRoomNumber(10);
        Assert.assertEquals(Target, shelfNumber);
    }

    /**
     * any() 可以表示任意值或属性的传入
     * 本方法默认返回null,因此不能与基础类型返回的参数方法相匹配，当发生隐式强制转换时，会出现NullPointerException
     * anyInt() 可以替代基础类型 int的数值验证。
     * any(Integer.class) 用于验证类型对象，注意：本方法排除null值
     */
    @Test
    public void testAny() {
        BookService bookService = Mockito.mock(BookService.class);
        final int Target = 30;
        when(bookService.getShelfNumber(anyInt()/*此处不能使用 any(),因其返回的是null，不可转换为整型类型 */))
                .thenReturn(Target);
        int shelfNumber = bookService.getShelfNumber(10);
        Assert.assertEquals(Target, shelfNumber);
    }
}
